﻿



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Omu.ValueInjecter;

//using System.EnterpriseServices;
using AppGISENA.ObjetosNegocio;
using AppGISENA.AccesoDatos;
using AppGISENA.UIServicios.ServiciosRemotos;







namespace AppGISENA.UIServicios
{
    public class UnidadProductivaServicios:IUnidadProductivaDataService 
    {
       //conexion al contexto de GISENA
        private BDGISENAEntities1 GisenaDb = new BDGISENAEntities1();
        //Conexion que trae datos de sofia plus

        private BDSOFIAEntities SofiaBD = new BDSOFIAEntities(); 
       
        ///IMPLEMENTACION DE SERVICIOS DE SOFIA PLUS
        /// <summary>
        /// Consultar en SOFIAPLUS
        /// </summary>
        /// <param name="codup"></param>
        /// <returns></returns>
        public List<SOFIA> getUPSofiaRemotaById(string codup)
        {

           // var upsofiacod = SofiaBD.SOFIA.Find(codup);

           // return upsofiacod;

            var sofia = (from mysofia in SofiaBD.SOFIA
                         where mysofia.COD_UNIDAD_PROD== codup
                         select mysofia).ToList();
            return sofia;
            //DefaultIfEmpty(), tambien funciona
          

        }


        public List<Instructor> getlistRemoteInstructor()
        {

            var sofia = SofiaBD.Instructor.ToList();
            return sofia;

        }

        
        /// <summary>
        /// Adicionar la caracterizacion de la UP
        /// </summary>
        /// <param name="unidadproductivaBo"></param>
        /// <returns></returns>
        public void CreateUnidadProductiva(CaracterizacionBo unidadproductiva)
        {


          //  var transactionStatus = new TransactionStatus();
           var caractunidadproductiva = BuiltCaractUPDomain(unidadproductiva);
           GisenaDb.Caracterizacion_UP.Add(caractunidadproductiva);
            GisenaDb.SaveChanges();

          //  return transactionStatus;
            
        }
        /// <summary>
        /// crear unidad en Sofia_UP, luego de consultarla en Sofia
        /// </summary>
        /// <param name="upsofiaBo"></param>
        public void CreateUPSofia(UnidadProductivaSofiaBo upsofiaBo)
        {
            var caractupsofia = BuiltUPsofiaDomain(upsofiaBo);

            GisenaDb.UP_Sofia.Add(caractupsofia);
            GisenaDb.SaveChanges();
        }
       
        /// <summary>
        /// Crear localizacion de UP
        /// </summary>
        /// <param name="localizacionup"></param>
       public void CreateUPLocalizacion(UpLocalizacionBO localizacionup)
       {
           var localizacion = BuiltLocalizacionDomain(localizacionup);

           GisenaDb.UP_Localizacion.Add(localizacion);
           GisenaDb.SaveChanges();


       }


        /// <summary>
        /// crear socio de Up luego de consultar en SofiaPlus
        /// </summary>
        /// <param name="socioup"></param>
        public void CreateSocio(socioBo socioup)
        {
            var socio = BuiltSocioUPDomain(socioup);
            GisenaDb.Socio.Add(socio);
            GisenaDb.SaveChanges();


        }

        /// <summary>
        /// Crear asesor de la unidad productiva
        /// </summary>
        /// <param name="asesor"></param>
        public void CreateAsesor(asesorBO asesor)
        {

            var asesorup = BuilAsesorDomain(asesor);
            GisenaDb.Asesor.Add(asesorup);
            GisenaDb.SaveChanges();

        }

        /// <summary>
        /// Crear Produccion de la U.P
        /// </summary>
        /// <param name="produccionbo"></param>
        public void CreateProduccion(ProduccionBo produccionbo){

            var produccion=BuiltProduccionDomain(produccionbo);
            GisenaDb.Produccion.Add(produccion);
            GisenaDb.SaveChanges();


        }

        public void CreateVincularAsesores(VincularAsesorBo asesor)
        {
            var vincularAsesoresfinal = BuiltVincularAsesorDomain(asesor);
            GisenaDb.Vincular_Asesor.Add(vincularAsesoresfinal);
            GisenaDb.SaveChanges();


        }
        /// <summary>


        /// <summary>
        /// listar todos los productos
        /// </summary>
        /// <returns></returns>

        public List<ProductosBO> GetProductos()
        {

            var productos = GisenaDb.Producto_Final.ToList();
            return productos.Select(s => BuiltProductosBo(s)).ToList();
        }
        /// <summary>
        /// Borrar ProductoOfertado seleccionada por ID
        /// </summary>
        /// <param name="id"></param>
        public  void DeleteProductoOfertado(int id)
        {
          


            var productoOfertado = GisenaDb.Productos_Ofertados.Find(id);
          //  var entidadAborrar = BuiltSproductoOfertadoBo(entity);
            if (productoOfertado == null) return; // no encontrado. Asume que ya fue borrado
            GisenaDb.Productos_Ofertados.Remove(productoOfertado);
        }

        public productosOfertadosBO getProductoOfertadoByID(int codproductoOfertado)
        {

            var sofia = (from mysofia in GisenaDb.Productos_Ofertados
                         where mysofia.Id_Prod_Ofert == codproductoOfertado
                         select mysofia).SingleOrDefault();

            //DefaultIfEmpty(), tambien funciona
            if (sofia != null)
                return BuiltSproductoOfertadoBo(sofia);
            else
            {

                return null;
            }

        }

        /// <summary>
        /// listar Caracterizacion UP
        /// </summary>
        /// <returns></returns>
       public List<CaracterizacionBo> GetUPCaracterizacion()
        {

            var upsofia = GisenaDb.Caracterizacion_UP.ToList();
            return upsofia.Select(s => BuiltUPCaracterizadaBo(s)).ToList();
        }

    /// <summary>
    /// Crear un producto ofertado
    /// </summary>
    /// <param name="productosofertados"></param>
        public void CreateProductoOfertado(productosOfertadosBO productosofertados)
        {
            var productoofertado = BuiltProductosOfertadosDomain(productosofertados);
            GisenaDb.Productos_Ofertados.Add(productoofertado);
            GisenaDb.SaveChanges();
        }
        /// <sumymary>
        /// Listar los tipos de UP que existen
        /// </summary>
        /// <returns></returns>
        public List<TipoUPBO> GetTipoUP()
        {
            var tipoUP = GisenaDb.Tipo_UP.ToList();

            return tipoUP.Select(s => BuiltTipoProductivaBo(s)).ToList();
        }


         //<summary>
         //listar los estados que puede tener un UP
         //</summary>
         //<returns></returns>
        public List<EstadoUPBO> GetEstadoUP()
        {
            var estadosUP = GisenaDb.Estado_UP.ToList();

            return estadosUP.Select(s => BuiltEStadoUPBo(s)).ToList();
        }

        /// <summary>
        /// Listar tipos de certificacion
        /// </summary>
        /// <returns></returns>
        public List<TipoCertificacionBO> getListTipoCertifica() 
        {

            var certifica = GisenaDb.Tipo_Certificacion.ToList();
            return certifica.Select(s => BuiltTipoCertificaBo(s)).ToList();
        
        }

        /// <summary>
        /// Listar unidades de medida
        /// </summary>
        /// <returns></returns>
       public List<UnidadMedidaBo> getListUnidadMedida()
        {
            var unidadm = GisenaDb.Unidad_Medida.ToList();
            return unidadm.Select(s => BuiltUnidadMedidaBo(s)).ToList();


        }

        /// <summary>
        /// retorna el listado de roles posibles de un asesor
        /// </summary>
        /// <returns></returns>
       public List<TipoRolAsesorBo> GetRolasesor()
       {
           var rolesAsesor = GisenaDb.Tp_Rol_Asesor.ToList();
           return rolesAsesor.Select(s => BuiltListRolesAsesorBo(s)).ToList();


       }



        /// <summary>
        /// obtener unidad productiva
        /// </summary>
        /// <returns></returns>
        public List<UnidadProductivaSofiaBo> GetUpSofia(){

            var upsofia = GisenaDb.UP_Sofia.ToList();
            return upsofia.Select(s => BuiltUPSofiaBo(s)).ToList();
        
        }

        /// <summary>
        /// implementacion de buscar Up obtenida de SofiaPlus y guardada en UP_Sofia de GISENA, por Codigo de UP 
        /// </summary>
        /// <param name="codup"></param>
        /// <returns></returns>
        public UPSofiaCaracterizacionBO getUPSofiaById(long codup)
        {
            
            var sofia=(from mysofia in GisenaDb.UP_Sofia
                       join mycaract in GisenaDb.Caracterizacion_UP on mysofia.Cod_UP equals
                       mycaract.Cod_UP
                        select new{  mysofia, mycaract   }).ToList().Select(x=>new UPSofiaCaracterizacionBO().InjectFrom(x.mysofia)
                                                                                                   .InjectFrom(x.mycaract)
                                                      as UPSofiaCaracterizacionBO);
            if (sofia != null)
                return sofia.FirstOrDefault();
            else
            {

                return null;
            }
        }

        /// <summary>
        /// Listar productos ofertados en un Grid
        /// </summary>
        /// <param name="codup"></param>
        /// <returns></returns>
        public List<productosOfertadosGrid> listarGridProductoOfertado(long codup)
        {

            var productosGrid = (from myproducofertado in GisenaDb.Productos_Ofertados
                                 join productos in GisenaDb.Producto_Final on myproducofertado.Id_Prod_Final equals productos.Id_Prod_Final
                                 join tipoproducto in GisenaDb.Tipo_Producto on productos.Id_tp_Prod equals tipoproducto.Id_Tp_Prod
                                 where myproducofertado.Cod_UP == codup
                                 select new { myproducofertado, productos, tipoproducto }).ToList().Select(x => new productosOfertadosGrid()
                                                                                        .InjectFrom(x.myproducofertado)
                                                                                        .InjectFrom(x.productos)
                                                                                        .InjectFrom(x.tipoproducto)

                                                                                         as productosOfertadosGrid);



            if (productosGrid != null)
                return productosGrid.ToList();
            else
            {

                return null;
            }           
  
        }
        

        public List<UP_Sofia> getListUPSofiaById(long codup)
        {


            var UPSofialista = (from mysofia in GisenaDb.UP_Sofia
                         join mycaract in GisenaDb.Caracterizacion_UP on mysofia.Cod_UP equals mycaract.Cod_UP
                         where mysofia.Cod_UP == codup
                         select mysofia).ToList();


            if (UPSofialista != null)
                return UPSofialista;
            else
            {

                return null;
            }


        }


        /// <summary>
        /// buscar en Sofia Plus
        /// </summary>
        /// <param name="CodUP"></param>
        /// <returns></returns>
        public asesorBO GetAsesorByCodUP(long CodUP)
        {

           
            throw new NotImplementedException();

        }

       


        /// <summary>
        /// implementacion de buscar unidad productiva caracterizada por Codigo de Up
        /// </summary>
        /// <param name="codup"></param>
        /// <returns></returns>
        public CaracterizacionBo getUPCaracterizadaById(long codup)
        {
            //var upsofiacod = GisenaDb.Caracterizacion_UP.Find(codup);

            //return BuiltUPCaracterizadaBo(upsofiacod);



            var caracUP = (from mycaract in GisenaDb.Caracterizacion_UP
                           join mysofiaup in GisenaDb.Caracterizacion_UP on mycaract.Cod_UP equals mysofiaup.Cod_UP
                           where mycaract.Cod_UP == codup
                           select mycaract).FirstOrDefault();


            if (caracUP != null)
                return BuiltUPCaracterizadaBo(caracUP);
            else
            {

                return null;
            }


        }
        public List<categoriaBO> GetCategoriaUP()
        {
            throw new NotImplementedException();
        }

        public List<productosOfertadosBO> GetProductoUP()
        {

            throw new NotImplementedException();
            
            
            
            //throw new NotImplementedException();
        }
        

        ///INYECCION DE OBJETOS DE NEGOCIO
        /// <summary>
        /// inyectar entidad Caracterizacion_UP
        /// </summary>
        /// <param name="unidadproductivaBo"></param>
        /// <returns></returns>
        private Caracterizacion_UP BuiltCaractUPDomain(CaracterizacionBo unidadproductivaBo)
        {
            return (Caracterizacion_UP)new Caracterizacion_UP().InjectFrom(unidadproductivaBo);
        }


        private CaracterizacionBo BuiltUPCaracterizadaBo(Caracterizacion_UP unidadproductiva)
        {
            return (CaracterizacionBo)new CaracterizacionBo().InjectFrom(unidadproductiva);
        }

        /// <summary>
        /// Inyectar la entidad UP_Localizacion
        /// </summary>
        /// <param name="localizacionBO"></param>
        /// <returns></returns>
        private UP_Localizacion BuiltLocalizacionDomain(UpLocalizacionBO localizacionBO)
        {

            return (UP_Localizacion)new UP_Localizacion().InjectFrom(localizacionBO);
        }

        /// <summary>
        /// Inyectar la entidaad Pruccion del objeto de negocio ProduccionBo
        /// </summary>
        /// <param name="produccionbo"></param>
        /// <returns></returns>
        private Produccion BuiltProduccionDomain(ProduccionBo produccionbo)
        {


            return (Produccion)new Produccion().InjectFrom(produccionbo);

        }

        /// <summary>
        /// inyectar la entidad de negocio TipoUPBO a Tipo_UP
        /// </summary>
        /// <param name="tipounidadproductiva"></param>
        /// <returns></returns>
        private TipoUPBO BuiltTipoProductivaBo(Tipo_UP tipounidadproductiva)
        {
            return (TipoUPBO)new TipoUPBO().InjectFrom(tipounidadproductiva);
        }

        /// <summary>
        /// inyectar unidad de medida Unidad_Medida a Objeto de negocio UnidadMedidaBO
        /// </summary>
        /// <param name="unidadmedida"></param>
        /// <returns></returns>
        private UnidadMedidaBo BuiltUnidadMedidaBo(Unidad_Medida unidadmedida)
        {
            return (UnidadMedidaBo)new UnidadMedidaBo().InjectFrom(unidadmedida);


        }


        private TipoRolAsesorBo BuiltListRolesAsesorBo(Tp_Rol_Asesor rolasesor)
        {

            return (TipoRolAsesorBo)new TipoRolAsesorBo().InjectFrom(rolasesor);

        }

        /// <summary>
        /// inyectar EstadoUP en Estado_UP
        /// </summary>
        /// <param name="estadoup"></param>
        /// <returns></returns>
        private EstadoUPBO BuiltEStadoUPBo(Estado_UP estadoup)
        {
            return (EstadoUPBO)new EstadoUPBO().InjectFrom(estadoup);
        }


        /// <summary>
        /// inyectar Vincular_Asesor a objeto de negocio VincularAssorBo
        /// </summary>
        /// <param name="vinculasesorBo"></param>
        /// <returns></returns>
        private Vincular_Asesor BuiltVincularAsesorDomain(VincularAsesorBo vinculasesorBo)
        {
            return (Vincular_Asesor)new Vincular_Asesor().InjectFrom(vinculasesorBo);
        
        
        }
        private TipoCertificacionBO BuiltTipoCertificaBo(Tipo_Certificacion tipocert)
        {

            return (TipoCertificacionBO)new TipoCertificacionBO().InjectFrom(tipocert);
        }

        private Productos_Ofertados BuiltProductosOfertadosDomain(productosOfertadosBO productoofertadoBo)
        {
            return (Productos_Ofertados)new Productos_Ofertados().InjectFrom(productoofertadoBo);
        }


        private productosOfertadosBO BuiltSproductoOfertadoBo(Productos_Ofertados productoofertado)
        {
            return (productosOfertadosBO)new productosOfertadosBO().InjectFrom(productoofertado);
        }

        private ProductosBO BuiltProductosBo(Producto_Final productosbo)
        {

            return (ProductosBO)new ProductosBO().InjectFrom(productosbo);

        }

        private Producto_Final BuiltProductoDomain(ProductosBO producto)
        {

            return (Producto_Final)new Producto_Final().InjectFrom(producto);

        }


        ///// <summary>
        ///// inyectar UP_sofia
        ///// </summary>
        ///// <param name="upsofiabo"></param>
        ///// <returns></returns>
        private UnidadProductivaSofiaBo BuiltUPSofiaBo(UP_Sofia upsofiabo)
        {
            return (UnidadProductivaSofiaBo)new UnidadProductivaSofiaBo().InjectFrom(upsofiabo);
        }

        private UP_Sofia BuiltUPsofiaDomain(UnidadProductivaSofiaBo unidadsofiabo)
        {

            return (UP_Sofia)new UP_Sofia().InjectFrom(unidadsofiabo);
        }

        /// <summary>
        /// inyectar socio
        /// </summary>
        /// <param name="socioup"></param>
        /// <returns></returns>
        private Socio BuiltSocioUPDomain(socioBo socioup)
        {

            return (Socio)new Socio().InjectFrom(socioup);

        }

        /// <summary>
        /// inyectar Asesor
        /// </summary>
        /// <param name="asesorup"></param>
        /// <returns></returns>
        private Asesor BuilAsesorDomain(asesorBO asesorup)
        {

            return (Asesor)new Asesor().InjectFrom(asesorup);
        }


      
    }
}
